/*
 * Created on 30-ene-2005
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package com.juanfrivaldes.cio2005.web;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.upload.FormFile;
import org.springframework.dao.DataAccessException;
import org.springframework.mail.MailException;

import com.juanfrivaldes.cio2005.domain.Ponencia;
import com.juanfrivaldes.cio2005.domain.Usuario;

/**
 * @author root
 * 
 * TODO To change the template for this generated type comment go to Window -
 * Preferences - Java - Code Style - Code Templates
 */
public class AltaPonenciaAction extends PrivateAction {

	protected String directory="/cio2005-resumenes/";

	private static Log log = LogFactory.getLog(AltaPonenciaAction.class);

	protected void writeFile(FormFile file, String path) throws IOException {

		// retrieve the file data
		InputStream stream = file.getInputStream();

		// write the file to the file specified
		OutputStream bos = new FileOutputStream(path);
		int bytesRead = 0;
		byte[] buffer = new byte[8192];
		while ((bytesRead = stream.read(buffer, 0, 8192)) != -1) {
			bos.write(buffer, 0, bytesRead);
		}
		bos.close();

	}

	protected ActionForward protectedExecute(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		if (isCancelled(request)) {
			request.getSession(false).setAttribute("coautores", null);
			return mapping.findForward("inicio");
		}

		AltaPonenciaForm altaForm = (AltaPonenciaForm) form;
		Usuario user = (Usuario) request.getSession(false).getAttribute(
				"currentUser");
		assert user != null : "El usuario deberia estar comprobado que no es nulo";

		log.trace("current user:" + user.getEmail());

		// solo se trata de agregar un nuevo coautor
		if (((String) request.getParameter("action")).equals("Añadir coautor")) {
			List coautores = (List) request.getSession(false).getAttribute(
					"coautores");
			if (coautores == null) {
				coautores = new ArrayList();
			}
			ActionMessages errors = validarCoautor(user.getEmail(), coautores,
					altaForm.getCoautor());
			if (errors != null) {
				this.saveErrors(request, errors);
			} else {
				log.trace("nuevo coautor: " + altaForm.getCoautor());
				coautores.add(altaForm.getCoautor());
				request.getSession(false).setAttribute("coautores", coautores);
			}
			log.trace(mapping.getInput());
			return mapping.findForward("mismo");
		}

		try {
			Ponencia ponencia = new Ponencia();

			BeanUtils.copyProperties(ponencia, altaForm);

			ponencia.setAutor(user.getEmail());

			
			List coautores=(List) request.getSession(false)
			.getAttribute("coautores");
			ponencia.setCoautores(coautores);
			if(coautores!=null){
			log.trace("Coautores para la ponencia: "
					+ ((List) request.getSession(false).getAttribute(
							"coautores")).size());
			}
			else{
				log.trace("no se han definido coautores para la ponencia");
			}
			request.setAttribute("nuevaPonencia", ponencia);

			try {

				getCio2005().addPonencia(ponencia);
			} catch (DataAccessException e) {
				log.trace("seguramente se intento repetir ponencia:"
						+ e.getMessage());
				return mapping.findForward("failure");
			}

			log.trace("alta ponencia: " + altaForm.getTitulo() + " "
					+ user.getEmail() + " " + altaForm.getCategoria());

			try {
				writeFile(altaForm.getResumen(), directory
						+ ponencia.getId() + ".pdf");
			} catch (IOException e) {
				log.trace("Error de entrada salida en ponencia"
						+ ponencia.getTitulo() + " de " + ponencia.getAutor()
						+ ": " + e.getMessage());
				// damos el error porque al fin y al cabo la ponencia no se
				// registro
				// (bueno,si)
				return mapping.findForward("ioFailure");
			}

			try {
				getCio2005().sendMailResumen(user, ponencia);
			} catch (MailException e) {
				log.trace("Envio Fallido de alta a la dirección "
						+ user.getEmail() + ":\n" + e.getMessage());
			}

			altaForm.setCategoria("");
			altaForm.setTitulo("");
			altaForm.setCoautor("");
			request.getSession(false).setAttribute("coautores", null);

			log.trace("limpiados campos");

		} catch (Exception e) {
			log.trace("Registro FALLIDO (Excepcion no capturada) de ponencia para"
					+ user.getEmail() + "--" + altaForm.getTitulo() + "\n");
			log.trace(e.getMessage());
			log.trace(e.getCause());
			log.trace(e.getStackTrace());
			return mapping.findForward("dataFailure");
		}
		return mapping.findForward("success");

	}

	/**
	 * @param coautores
	 * @return
	 */
	private ActionMessages validarCoautor(String autor, List coautores,
			String coautor) throws DataAccessException {

		if (getCio2005().getUsuario(coautor) == null) {
			ActionMessages errors = new ActionErrors();
			errors.add("coautor", new ActionMessage(
					"altaPonencia.coautor.problema"));
			log.trace("altaPonencia.coautor.problema");
			return errors;
		} else if (coautores.contains(coautor)) {
			ActionMessages errors = new ActionErrors();
			errors.add("coautor", new ActionMessage(
					"altaPonencia.coautorRepetido.problema"));
			log.trace("altaPonencia.coautorRepetido.problema");
			return errors;
		} else {
			if (coautor.equals(autor)) {
				ActionMessages errors = new ActionErrors();
				log.trace("autor quiere ser coautor" + autor);
				errors.add("coautor", new ActionMessage(
						"altaPonencia.coautorIgual.problema"));
			}
		}

		return null;
		/*
		 * log.trace((String) coautores.get(i));
		 * log.trace("altaPonencia.coautor" + (i + 1) + ".problema");
		 * 
		 * if (getCio2005().getUsuario((String) coautores.get(i)) == null) {
		 * ActionMessages errors = new ActionErrors(); errors.add("coautor" + (i +
		 * 1), new ActionMessage( "altaPonencia.coautor" + (i + 1) +
		 * ".problema")); log.trace("altaPonencia.coautor" + (i + 1) +
		 * ".problema"); return errors; } }
		 */

	}

}
